// TCPClient.hpp
#ifndef TCPCLIENT_HPP
#define TCPCLIENT_HPP

#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <mutex>
#include <atomic>

#if defined(_WIN32) || defined(_WIN64)
#define _WIN32_WINNT 0x0600
#endif

#include <WinSock2.h>

#ifdef _WIN32
#include <ws2tcpip.h>
#else
#include <arpa/inet.h>
#endif

// #pragma comment(lib, "ws2_32.lib") // 加载 winsock2.lib

class TCPClient
{
public:
    TCPClient(const std::string &serverIP, int serverPort);
    ~TCPClient();

    // 初始化客户端
    bool initialize();

    // 启动连接和重连线程
    void startConnection();

    // 停止连接
    void stopConnection();

    // 发送数据
    bool sendData(const std::string &data);

    // 接收数据
    std::string receiveData();

    // 接收数据线程函数
    void receiveDataInThread();

    // 检查是否连接成功
    bool isConnected() const;

private:
    // 连接服务器
    bool connectToServer();

    // 重连线程函数
    void reconnectThread();

    std::string m_serverIP; // 服务器IP
    int m_serverPort;       // 服务器端口
    SOCKET m_clientSocket;  // 客户端套接字

    std::thread m_reconnectThread;   // 重连线程
    std::atomic<bool> m_isRunning;   // 运行标志
    std::atomic<bool> m_isConnected; // 连接状态

    std::thread m_receiveThread;        // 数据接收线程
    std::atomic<bool> m_receiveRunning; // 接收线程运行状态标志

    std::mutex m_socketMutex; // 套接字互斥锁
};

#endif // TCPCLIENT_HPP